package com.lins.store.config;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import springfox.documentation.builders.ApiInfoBuilder;
import springfox.documentation.builders.ParameterBuilder;
import springfox.documentation.builders.PathSelectors;
import springfox.documentation.builders.RequestHandlerSelectors;
import springfox.documentation.schema.ModelRef;
import springfox.documentation.service.ApiInfo;
import springfox.documentation.service.Parameter;
import springfox.documentation.spi.DocumentationType;
import springfox.documentation.spring.web.plugins.Docket;
import springfox.documentation.swagger2.annotations.EnableSwagger2;

import java.util.ArrayList;
import java.util.List;


/**
 * 实时接口文文档生成工具（swagger.io）配置
 * swagger2需要引入2个jar包，swagger3只需要一个
 * Docket配置：一组(一个项目或一个版本)接口文档的配置，比如设置名称，联系人等等
 * http://127.0.0.1/swagger-ui.html#/
 */
@Configuration
@EnableSwagger2 //开启swagger功能，可放在启动类上。因为本类是配置类，所以启动时也会同时启动。
public class SwaggerConfig {

    /**
     * 设置多个Docket
     * @return
     */
//    @Bean
//    public Docket appApi() {
//        List<Parameter> pars = new ArrayList<>();
//        ParameterBuilder token = new ParameterBuilder();
//        token.name("token").description("用户令牌").modelRef(new ModelRef("string")).parameterType("header").required(false).build();
//        pars.add(token.build());
//        return new Docket(DocumentationType.SWAGGER_2).select().paths(regex("/app/.*")).build()
//                .globalOperationParameters(pars).apiInfo(pdaApiInfo()).useDefaultResponseMessages(false)
//                .enable(enableSwagger)
//                .groupName("appApi");
//    }
//
//    @Bean
//    public Docket adminApi() {
//        List<Parameter> pars = new ArrayList<>();
//        ParameterBuilder token = new ParameterBuilder();
//        token.name("token").description("用户令牌").modelRef(new ModelRef("string")).parameterType("header").required(false).build();
//        pars.add(token.build());
//        return new Docket(DocumentationType.SWAGGER_2).select().paths(regex("/admin/.*")).build()
//                .globalOperationParameters(pars).apiInfo(pdaApiInfo()).useDefaultResponseMessages(false)
//                .enable(enableSwagger)
//                .groupName("adminApi");
//    }


    /**
     * 设置Docket
     * @return
     */
    @Bean
    public Docket createRestApi() {
        return new Docket(DocumentationType.SWAGGER_2).apiInfo(apiInfo()).select()
                .apis(RequestHandlerSelectors.basePackage("com.lins.store.controller")).paths(PathSelectors.any())
                .build().globalOperationParameters(setHeaderToken());
    }

    /**
     * 设置标题名称和版本号
     * @return
     */
    private ApiInfo apiInfo() {
        return new ApiInfoBuilder()
                .title("action-swagger")
                .description("storeDisk网盘")
                .termsOfServiceUrl("")
                .version("1.0")
                .build();
    }

    /**
     * 设置swagger文档中全局参数
     * 生成文档的所有接口中，都要包含一个header类型的token参数(可选)
     * @return
     */
    private List<Parameter> setHeaderToken() {
        List<Parameter> pars = new ArrayList<>();
        ParameterBuilder userId = new ParameterBuilder();
        userId.name("token").description("用户TOKEN").modelRef(new ModelRef("string"))
                .parameterType("header").required(true).build();
        pars.add(userId.build());
        return pars;
    }
}
